﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using Npgsql;

namespace Golfvision2020
{
    public partial class RegistreraTävling : Form
    {
        public List<Sponsor> sponsorer = new List<Sponsor>();

        public class Sponsor
        {
            public string _Id { get; set; }
            public string _Name { get; set; }

            public Sponsor(string n, string i)
            {
                _Id = i;
                _Name = n;
            }

            public override string ToString()
            {
                return _Name;
            }
        }

        public Tävlingar Tavlingar;

        public RegistreraTävling(Tävlingar tavlingar)
        {
            Tavlingar = tavlingar;
            InitializeComponent();

            GetSponsorerFromDB();
        }

        private void GetSponsorerFromDB()
        {
            sponsorer.Clear();
            SponsorCombobox.DataSource = null;
            //Ett commandobjekt skapas och knyts till ett sql-uttryck och en db-koppling
            NpgsqlCommand command = new NpgsqlCommand("select sponsor,sponsor_id from sponsor", Tavlingar.Klubben.conn);
            NpgsqlDataReader dr = command.ExecuteReader();  //Kommandot körs och resultatet läggs i ett datareader-objekt
            while (dr.Read()) //En loop som rad för rad läser innehållet i datareader'n
            {
                sponsorer.Add(new Sponsor(dr["sponsor"].ToString(), dr["sponsor_id"].ToString()));
            }
            dr.Close();

            SponsorCombobox.ValueMember = "_Id";
            SponsorCombobox.DisplayMember = "_Namn";
            SponsorCombobox.DataSource = sponsorer;
        }

        private void Avbryt4Button_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void ReggaTävlingButton_Click(object sender, EventArgs e)
        {
            if (StarttidPicker.Value > SluttidPicker.Value)
            {
                MessageBox.Show("Starttiden kan inte ha datum/tid efter vald sluttid.");
                return;
            }

            if (SistaAnmälTimepicker.Value > StarttidPicker.Value &&
                SistaAvanmälTimepicker.Value > StarttidPicker.Value)
            {
                MessageBox.Show("Du har valt fel datum för sista anmälning/avanmälningsdag");
                return;
            }

            // Kolla att inte tävlingen överlappar en annan tävling
            String check_tavl_sql = String.Format(@"
                SELECT namn, spelstart, spelslut FROM tavling 
                WHERE (to_timestamp('{0}', 'YYYY-MM-DD HH24:MI:SS') > spelstart AND to_timestamp('{0}', 'YYYY-MM-DD HH24:MI:SS') < spelslut) 
                OR  (to_timestamp('{1}', 'YYYY-MM-DD HH24:MI:SS') > spelstart AND to_timestamp('{1}', 'YYYY-MM-DD HH24:MI:SS') < spelslut);",
                StarttidPicker.Value.ToString(), StarttidPicker.Value.ToString());
            NpgsqlCommand check_cmd = new NpgsqlCommand(check_tavl_sql, Tavlingar.Klubben.conn);

            NpgsqlDataReader dr_krockar = check_cmd.ExecuteReader();
            while (dr_krockar.Read()) // Kolla om det finns en eller flera tävlingar under bokningstiden
            {
                MessageBox.Show("Tävlingen " + dr_krockar["namn"].ToString() + " finns bokad på denna tid mellan\n " +
                                dr_krockar["spelstart"].ToString() + " och " + dr_krockar["spelslut"].ToString());
                dr_krockar.Close();
                return;
            }
            dr_krockar.Close();




            if (!(A.Value < B.Value && B.Value < C.Value))
            {
                MessageBox.Show("A måste vara mindre än B, och B måste vara mindre än C");
                return;
            }

            if (TävlingsnamnTextbox.Text.Length < 1 || SponsorCombobox.Text.Length < 1)
            {
                MessageBox.Show("Textboxen får inte vara tom");
                return;
            }
            // Kolla så att boxarna inte innehåller specialtecken
            if (Regex.Match(TävlingsnamnTextbox.Text + SponsorCombobox.Text, @"[^a-zåäöA-ZÅÄÖ0-9\s]").Success)
            {
                MessageBox.Show("Textboxen får inte innehålla specialtecken");
                return;
            }

            String sponsorId;

            if (SponsorCombobox.SelectedValue == null)
            {
                String sql = String.Format(@"INSERT INTO sponsor(sponsor, senast_uppdaterad)
                                           VALUES ('{0}', '{1}');",
                                           SponsorCombobox.Text, DateTime.Now);
                NpgsqlCommand cmd = new NpgsqlCommand(sql, Tavlingar.Klubben.conn);
                if (cmd.ExecuteNonQuery() != 1)
                {
                    MessageBox.Show("Sponsorn kunde ej läggas till");
                    return;
                }
                sql = String.Format(@"SELECT sponsor_id FROM sponsor WHERE sponsor='{0}' limit 1;",
                                    SponsorCombobox.Text);
                cmd = new NpgsqlCommand(sql, Tavlingar.Klubben.conn);
                NpgsqlDataReader dr = cmd.ExecuteReader();
                dr.Read();
                sponsorId = dr["sponsor_id"].ToString();
                dr.Close();
            }
            else
            {
                sponsorId = SponsorCombobox.SelectedValue.ToString();
            }

            String sql2 = String.Format(@"INSERT INTO tavling(namn, sponsor_id, spelstart, spelslut, sistaregdat, 
                                        sistaavregdat, handicap_a, handicap_b, handicap_c, registrerad, antal_deltagare)
                                        VALUES ('{0}', {1}, '{2}', '{3}', '{4}', '{5}', {6}, {7}, {8}, '{9}', {10});",
                                        TävlingsnamnTextbox.Text, sponsorId, StarttidPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                                        SluttidPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                                        SistaAnmälTimepicker.Value, SistaAvanmälTimepicker.Value,
                                        A.Value, B.Value, C.Value, DateTime.Now, AntalSpelareNum.Value);
            NpgsqlCommand c = new NpgsqlCommand(sql2, Tavlingar.Klubben.conn);
            if (c.ExecuteNonQuery() != 1)
            {
                MessageBox.Show("Tävlingen kunde ej läggas till");
                return;
            }
            else
            {
                MessageBox.Show("Tävlingen " + TävlingsnamnTextbox.Text + " lades till");
            }
            this.Close();
        }
    }
}
